package com.yzm.file;


import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 文件（夹） 的遍历
 */
public class FileWalk {

    public static void main(String[] args) {

        /**
         * 通过Files的walkFileTree 遍历文件（夹）
         * param 1 文件（夹）路径
         * param 2 文件访问接口处理
         *
         * 注意：
         *     该文件统计结果：与右键文件属性  对比来看，文件夹会多一个，因为文件属性是不计算当前文件夹的
         */

        AtomicInteger file_count = new AtomicInteger();
        AtomicInteger dir_count = new AtomicInteger();
        try {
            Files.walkFileTree(Paths.get("G:\\IDEAProjects\\code-snippet\\Code-snippet-File"), new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                    System.out.println("进入文件夹之前执行：获取文件夹路径：" + dir);
                    dir_count.incrementAndGet();
                    return super.preVisitDirectory(dir, attrs);
                }

                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    System.out.println("进入文件之前执行：获取文件路径：" + file);
                    file_count.incrementAndGet();
                    return super.visitFile(file, attrs);
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    System.out.println("文件访问失败" + file);
                    return super.visitFileFailed(file, exc);
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    System.out.println("文件夹访问结束执行" + dir);
                    return super.postVisitDirectory(dir, exc);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("文件夹数量："+dir_count);
        System.out.println("文件数量："+file_count);
    }
}
